﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GSQ.BusinessEntities;
using GSQ.BusinessLogic;
using GSQ.Rpt_s;

namespace UIapp.Dialogos
{
    public partial class frmFacturas : Plantillas.frmDialogPlantilla, Interfaces.IPantalla
    {
        public frmFacturas(FACTURAS entity)
        {
            this.InicializarFRM(entity);
        }

        private void InicializarFRM(FACTURAS entity)
        {
            InitializeComponent();

            if (entity == null)
            {
                this.newEntity = new FACTURAS();
                this.oldEntity = null;
                this.ncf = new NcfBL().GetByIdCondicionTipo(0, "NA").FirstOrDefault();
                this.lblNcf.Text = this.ncf.DESCRIPCION;
            }
            else
            {
                this.oldEntity = entity;
                this.newEntity = new FacturasBL().GetById(entity.ID);
            }

            #region Condiciones
            this.cmbCondicion.DisplayMember = "CONDICION";
            this.cmbCondicion.ValueMember = "ID";
            this.cmbCondicion.DataSource = new CondicionesBL().GetAll();
            this.cmbCondicion.SelectedIndex = 2;
            #endregion

            #region Vendedores
            this.cmbVendedor.DisplayMember = "VENDEDOR";
            this.cmbVendedor.ValueMember = "ID";
            this.cmbVendedor.DataSource = new VendedoresBL().GetAll().Where(a => a.ACTIVO);
            #endregion

            if (Comun.usuario != null)
            {
                this.newEntity.ID_USUARIO = Comun.usuario.ID;
                this.newEntity.USUARIOS = Comun.usuario;
            }
            this.ctrAgregarProductos1.EditCosto = true;
            this.ctrAgregarProductos1.EditDescuento = true;
            this.ctrAgregarProductos1.AllowCantidadCero = false;
            this.ctrAgregarProductos1.COSTO_PRECIO = Controles.ctrAgregarProductos.CostoPrecio.Precio;
            this.BindControls();
            this.txtIdCliente.Text = Comun.utilidades.CLIENTE_POR_DEFECTO.ToString();
            this.txtIdCliente_Validating(new object(), new CancelEventArgs());
            this.cmbVendedor.SelectedIndex = -1;
            Comun.ShowEstatusNCF();
            this.txtIdCliente.Focus();
            this.txtIdCliente.SelectAll();
            this.ctrPrintTo1.Load(this.Name);
        }

        #region Variables
        public FACTURAS newEntity;
        public FACTURAS oldEntity;
        public CLIENTES cliente;
        public NCF ncf;
        bool entityError = false;
        #endregion

        #region Implementacion IPantalla
        public int ComandosSoportados
        {
            get { return 0; }
        }

        public void Nuevo()
        {
            throw new NotImplementedException();
        }

        public void Modificar()
        {
            throw new NotImplementedException();
        }

        public void Eliminar()
        {
            throw new NotImplementedException();
        }

        public void Refrescar()
        {
            throw new NotImplementedException();
        }

        public void Buscar()
        {
            throw new NotImplementedException();
        }

        public void AgregarProducto(Controles.TransferEntity tranferEntity)
        {
            foreach (FACTURAS_DETALLES t in this.newEntity.FACTURAS_DETALLES)
            {
                if (t.ID_PRODUCTO == tranferEntity.PRODUCTOS.ID)
                {
                    Comun.ShowInMainMessage("Producto " + tranferEntity.PRODUCTOS.CODIGO + " previamente agregado.");
                    return;
                }
            }
            FACTURAS_DETALLES facturaInvDetalle = new FACTURAS_DETALLES();

            facturaInvDetalle.ID = 0;
            facturaInvDetalle.ID_PRODUCTO = tranferEntity.PRODUCTOS.ID;
            facturaInvDetalle.CANTIDAD = tranferEntity.CANTIDAD;
            facturaInvDetalle.COSTO = tranferEntity.PRODUCTOS.COSTO;
            //facturaInvDetalle.PRECIO = tranferEntity.COSTO;

            if (tranferEntity.PRODUCTOS.IMPUESTOS)
            {
                facturaInvDetalle.PRECIO = (tranferEntity.COSTO) / ((Comun.utilidades.X_IMPUESTOS / 100) + 1);
                facturaInvDetalle.IMPUESTO = (tranferEntity.COSTO - facturaInvDetalle.PRECIO) * tranferEntity.CANTIDAD;
                facturaInvDetalle.X_IMPUESTO = Comun.utilidades.X_IMPUESTOS;
            }
            else
            {
                facturaInvDetalle.PRECIO = tranferEntity.COSTO;
                facturaInvDetalle.IMPUESTO = 0;
                facturaInvDetalle.X_IMPUESTO = 0;
            }
            facturaInvDetalle.DESCUENTO = tranferEntity.DESCUENTO;
            facturaInvDetalle.X_DESCUENTO = (facturaInvDetalle.DESCUENTO / (facturaInvDetalle.CANTIDAD * facturaInvDetalle.PRECIO)) * 100;
            facturaInvDetalle.C_DEVUELTA = 0;
            facturaInvDetalle.DESCRIPCIONES = tranferEntity.PRODUCTOS.DESCRIPCIONES;
            facturaInvDetalle.MEDIDAS = tranferEntity.PRODUCTOS.MEDIDAS;
            facturaInvDetalle.PRODUCTOS = tranferEntity.PRODUCTOS;
            if (facturaInvDetalle.IsValid())
            {
                this.newEntity.FACTURAS_DETALLES.Add(facturaInvDetalle);
                this.bindingSource.DataSource = this.newEntity.FACTURAS_DETALLES.ToList();
                this.CalcularTotales();
            }
            else
                Comun.ShowMessage(facturaInvDetalle);
        }
        #endregion

        #region Tratamiento de eventos

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirmación", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
                {
                    if (this.newEntity.FACTURAS_DETALLES.Count == 0)
                    {
                        Comun.ShowInMainMessage("Debe agregar por lo menos un item a la lista.");
                        return;
                    }

                    if (this.cmbVendedor.SelectedIndex < 0)
                    {
                        Comun.ShowInMainMessage("Debe seleccionar un vendedor.");
                        this.cmbVendedor.Focus();
                        return;
                    }

                    this.newEntity.FECHA_HORA = this.fechaDateTimePicker.Value;
                    this.newEntity.ID_CONDICION = (decimal)this.cmbCondicion.SelectedValue;
                    this.newEntity.ID_NCF = ncf.ID;
                    this.newEntity.ORDEN_COMPRA = this.txtOrdenCompra.Text.Trim();
                    this.newEntity.ID_VENDEDOR = (decimal)this.cmbVendedor.SelectedValue;
                    this.newEntity.ACTIVO = true;
                    this.newEntity.OBSERVACIONES = this.txtObservaciones.Text.Trim();
                    this.newEntity.T_DESCUENTO = decimal.Parse(this.lblTotalDescuento.Text);
                    this.newEntity.T_IMPUESTO = decimal.Parse(this.lblTotalImpuestos.Text);
                    if (this.ncf.IMPUESTOS)
                        this.newEntity.M_TOTAL = decimal.Parse(this.lblTotalGeneral.Text);
                    else
                        this.newEntity.M_TOTAL = decimal.Parse(this.lblTotalGeneral.Text) - decimal.Parse(this.lblTotalImpuestos.Text);
                    if (this.newEntity.ID_CONDICION == 2 && Comun.utilidades.COBRAR_FACTURAS_AL_GUARDAR)
                    {
                        frmFacturasPagos frm = new frmFacturasPagos(this.newEntity);
                        frm.ShowDialog();
                        if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                        {
                            this.backgroundWorker.RunWorkerAsync();
                            Comun.ShowLoadingFRM();
                        }

                        else
                            Comun.ShowInMainMessage("El pago es requerido para continuar");
                    }
                    else
                    {
                        this.backgroundWorker.RunWorkerAsync();
                        Comun.ShowLoadingFRM();
                    }
                    //this.txtIdCliente.Focus();
                    //this.txtIdCliente.SelectAll();     

                }
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Guardar();
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Comun.CloseLoadingFRM();
            if (e.Error != null)
                Comun.ShowMessage(e.Error);
            else if (this.entityError)
                return;
            else
            {
                Comun.ShowInMainMessage("Datos guardados correctamente.");
                this.DialogResult = System.Windows.Forms.DialogResult.OK;
                if (Properties.Settings.Default.FacturasPrintTo == 0)
                    if (newEntity.ID_CONDICION == 1)
                    {
                        try
                        {
                            new Reportes().PrintFacturaCarta(newEntity.ID, true);

                        }
                        catch (Exception ex)
                        {
                            Comun.ShowInMainMessage(ex.Message);
                            Plantillas.frmReportPreview frm = new Plantillas.frmReportPreview();
                            frm.crystalReportViewer1.ReportSource = new Reportes().GetFacturaCarta(newEntity.ID, true);
                            // frm.MdiParent = this.MdiParent;
                            frm.Show();
                        }
                    }
                    else
                    {
                        new Reportes().PrintFacturaTicket(newEntity.ID, true);
                    }
                else
                {
                    Plantillas.frmReportPreview frm = new Plantillas.frmReportPreview();
                    frm.crystalReportViewer1.ReportSource = new Reportes().GetFacturaCarta(newEntity.ID, true);
                    // frm.MdiParent = this.MdiParent;
                    frm.Show();
                }
                //   ((Vistas.frmFacturas)this.Owner).Listar(0);
                this.Close();
            }
        }

        private void radGridView_UserDeletingRow(object sender, Telerik.WinControls.UI.GridViewRowCancelEventArgs e)
        {
            this.newEntity.FACTURAS_DETALLES.Remove((FACTURAS_DETALLES)this.radGridView.CurrentRow.DataBoundItem);
            this.CalcularTotales();
        }

        private void txtIdCliente_Validating(object sender, CancelEventArgs e)
        {
            decimal id = 0;
            if (this.txtIdCliente.Text.Trim() != string.Empty)
            {
                if (decimal.TryParse(this.txtIdCliente.Text.Trim(), out id))
                {
                    if (this.cliente == null || this.cliente.ID != id)
                    {
                        BuscarCliente(id);
                    }
                }
                else
                {
                    Comun.ShowInMainMessage("Solo se permiten números en este campo.");
                    this.txtIdCliente.Focus();
                    this.txtIdCliente.SelectAll();
                    this.LimpiarClientesGroup();
                    this.cliente = null;
                }
            }
            else
            {
                this.pnlMisc.Enabled = false;
                this.ncf = new NcfBL().GetByIdCondicionTipo(0, "NA").FirstOrDefault();
                this.lblNcf.Text = this.ncf.DESCRIPCION;
                txtOrdenCompra.Clear();
                cmbVendedor.SelectedValue = 1;
                cmbCondicion.SelectedValue = 1;
                this.cmbVendedor.SelectedValue = null;
                this.LimpiarClientesGroup();
                this.cliente = null;
            }
        }

        private void txtIdCliente_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9)
            {
                e.Handled = true;
                Vistas.frmClientes frm = new Vistas.frmClientes(true);
                frm.ShowDialog();
                if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    cliente = (CLIENTES)frm.radGridView.CurrentRow.DataBoundItem;
                    if (this.cliente != null)
                    {
                        if (cliente.ACTIVO)
                        {
                            this.newEntity.ID_CLIENTE = cliente.ID;
                            this.newEntity.CLIENTES = cliente;
                            this.LimpiarClientesGroup();
                            this.txtIdCliente.Text = cliente.ID.ToString("00000");
                            this.lblCliente.Text = this.cliente.CLIENTE;
                            this.lblDireccionCliente.Text = this.cliente.DIRECCION;
                            this.lblCiudadCliente.Text = cliente.CIUDADES.CIUDAD;
                            this.lblTelefonoCliente.Text = cliente.TELEFONO;
                            this.lblRncCliente.Text = cliente.RNC;
                            this.pnlMisc.Enabled = true;
                            if (this.cliente.ID_FORMA_PAGO == 1)
                            {
                                this.cmbCondicion.SelectedIndex = 2;
                                this.cmbCondicion.Enabled = false;
                            }
                            else
                            {
                                this.cmbCondicion.Enabled = true;
                            }
                        }
                        else
                        {
                            Comun.ShowInMainMessage("Cliente está inactico. VERIFIQUE.");
                            this.LimpiarClientesGroup();
                            cliente = null;
                            this.txtIdCliente.Focus();
                        }
                    }
                }
            }
        }

        private void lblSeleccionarNcf_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (this.cliente != null)
            {
                Busquedas.frmNcf frm = new Busquedas.frmNcf((decimal)this.cmbCondicion.SelectedValue, "FA");
                frm.ShowDialog();
                if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    if (((NCF)frm.radGridView.CurrentRow.DataBoundItem).RNC_REQUERIDO && this.cliente.RNC == "0")
                    {
                        Comun.ShowInMainMessage("No se puede seleccionar este tipo NCF para este cliente.");
                        return;
                    }
                    this.ncf = (NCF)frm.radGridView.CurrentRow.DataBoundItem;
                    this.lblNcf.Text = this.ncf.DESCRIPCION;
                }
            }
        }

        private void lblCotizacion_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Busquedas.frmCotizaciones frm = new Busquedas.frmCotizaciones(this.cliente.ID);
            frm.ShowDialog();
            if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
            {
                if (this.newEntity.FACTURAS_DETALLES.Count > 0)
                    if (MessageBox.Show("Usted a agregado items para facturar y si continua estos seran eliminados ¿DESEA COTINUAR DE TODOS MODOS?", "Confirmación", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Cancel)
                        return;
                List<COTIZACIONES_DETALLES> cotizacionDetalle = new CotizacionesBL().GetById(((COTIZACIONES)frm.radGridView.CurrentRow.DataBoundItem).ID).COTIZACIONES_DETALLES;

                StringBuilder sbCotizacion = new StringBuilder();
                foreach (COTIZACIONES_DETALLES rw in cotizacionDetalle)
                {
                    PRODUCTOS p = new ProductosBL().GetById(rw.ID_PRODUCTO);
                    if (p.EXISTENCIA < rw.CANTIDAD)
                    {
                        sbCotizacion.AppendFormat("{0} SOLO TIENE {1} EN EXISTENCIA Y LA COTIZACION NECESITA {2}{3} ", p.CODIGO, p.EXISTENCIA.ToString("N2"), rw.CANTIDAD.ToString("N2"), Environment.NewLine);
                    }
                }
                if (sbCotizacion.ToString().Length > 0)
                {
                    sbCotizacion.AppendLine();

                    sbCotizacion.AppendLine("REVISE ESTO ANTES DE CONTINUAR CON ESTA COTIZACION");
                    MessageBox.Show(sbCotizacion.ToString(), "Revisar", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                this.newEntity.COTIZACIONES = (COTIZACIONES)frm.radGridView.CurrentRow.DataBoundItem;
                this.newEntity.ID_COTIZACIONES = this.newEntity.COTIZACIONES.ID.ToString();
                this.lblCotizacion.Text = this.newEntity.COTIZACIONES.ID.ToString();
                this.newEntity.ID_VENDEDOR = this.newEntity.ID_VENDEDOR;
                this.cmbVendedor.SelectedValue = newEntity.ID_VENDEDOR;
                this.newEntity.FACTURAS_DETALLES = new List<FACTURAS_DETALLES>();


                foreach (COTIZACIONES_DETALLES rw in cotizacionDetalle)
                {
                    this.newEntity.FACTURAS_DETALLES.Add(new FACTURAS_DETALLES
                    {
                        ID_PRODUCTO = rw.ID_PRODUCTO,
                        PRECIO = rw.PRECIO,
                        COSTO = rw.COSTO,
                        CANTIDAD = rw.CANTIDAD,
                        DESCUENTO = rw.DESCUENTO,
                        X_DESCUENTO = rw.X_DESCUENTO,
                        IMPUESTO = rw.IMPUESTO,
                        X_IMPUESTO = rw.X_IMPUESTO,
                        PRODUCTOS = rw.PRODUCTOS,
                        MEDIDAS = rw.MEDIDAS,
                        DESCRIPCIONES = rw.DESCRIPCIONES
                    });
                }
                this.bindingSource.DataSource = this.newEntity.FACTURAS_DETALLES;
                CalcularTotales();

            }
        }

        private void cmbCondicion_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
        {
            if (this.ncf != null)
            {
                if (ncf.ID_CONDICION != (decimal)this.cmbCondicion.SelectedValue && ncf.ID != 1)
                {
                    this.ncf = new NcfBL().GetByIdCondicionTipo(0, "NA").FirstOrDefault();
                    this.lblNcf.Text = this.ncf.DESCRIPCION;
                    Comun.ShowInMainMessage("Vuelva a seleccionar el tipo de NCF");
                }
            }
        }
        #endregion

        #region Metodos auxiliares
        public void BindControls()
        {
            this.fechaDateTimePicker.Value = this.newEntity.FECHA_HORA;
            this.cmbVendedor.SelectedValue = newEntity.ID_VENDEDOR;
            if (this.ncf != null)
                this.lblNcf.Text = this.ncf.DESCRIPCION;
            this.cmbCondicion.SelectedValue = this.newEntity.ID_CONDICION;
            if (this.newEntity.CLIENTES != null)
            {
                this.LimpiarClientesGroup();
                this.newEntity.CLIENTES = new ClientesBL().GetById(newEntity.ID_CLIENTE);
                this.txtIdCliente.Text = newEntity.CLIENTES.ID.ToString("00000");
                this.lblCliente.Text = this.newEntity.CLIENTES.CLIENTE;
                this.lblDireccionCliente.Text = this.newEntity.CLIENTES.DIRECCION;
                this.lblCiudadCliente.Text = this.newEntity.CLIENTES.CIUDADES.CIUDAD;
                this.lblTelefonoCliente.Text = this.newEntity.CLIENTES.TELEFONO;
                this.lblRncCliente.Text = this.newEntity.CLIENTES.RNC;
                this.pnlMisc.Enabled = true;
            }
            if (newEntity.ORDEN_COMPRA != string.Empty)
                this.txtOrdenCompra.Text = newEntity.ORDEN_COMPRA;
            if (this.newEntity.OBSERVACIONES != string.Empty)
                this.txtObservaciones.Text = newEntity.OBSERVACIONES;
            this.bindingSource.DataSource = this.newEntity.FACTURAS_DETALLES.ToList();
            this.CalcularTotales();
        }

        private void Guardar()
        {
            if (newEntity.IsValid())
            {
                if (this.oldEntity == null)
                {
                    new FacturasBL().Insert(this.newEntity);
                    if (this.newEntity.FACTURAS_PAGOS.Count > 0)
                    {
                        foreach (var item in newEntity.FACTURAS_PAGOS)
                        {
                            item.ID_FACTURA = newEntity.ID;
                        }
                        if (!new FacturasBL().PagarFactura(newEntity.FACTURAS_PAGOS))
                        {
                            Comun.ShowInMainMessage("La factura fue guardada correctamente pero el pago no pudo ser procesado.");
                        }
                    }
                }
                else
                {
                    new FacturasBL().Update(this.newEntity, this.oldEntity);
                    this.oldEntity = this.newEntity;
                }
                this.entityError = false;
            }
            else
            {
                this.entityError = true;
                Comun.ShowMessage(newEntity);
            }
        }

        public void BuscarCliente(decimal id)
        {
            this.cliente = new ClientesBL().GetById(id);

            if (this.cliente != null)
            {
                if (cliente.ACTIVO)
                {
                    this.newEntity.ID_CLIENTE = cliente.ID;
                    this.newEntity.CLIENTES = cliente;
                    this.LimpiarClientesGroup();
                    this.newEntity.CLIENTES = this.cliente;
                    this.txtIdCliente.Text = newEntity.CLIENTES.ID.ToString("00000");
                    this.lblCliente.Text = this.newEntity.CLIENTES.CLIENTE;
                    this.lblDireccionCliente.Text = this.newEntity.CLIENTES.DIRECCION;
                    this.lblCiudadCliente.Text = this.newEntity.CLIENTES.CIUDADES.CIUDAD;
                    this.lblTelefonoCliente.Text = this.newEntity.CLIENTES.TELEFONO;
                    this.lblRncCliente.Text = this.newEntity.CLIENTES.RNC;
                    this.pnlMisc.Enabled = true;

                    if (this.cliente.ID_FORMA_PAGO == 1)
                    {
                        this.cmbCondicion.SelectedIndex = 2;
                        this.cmbCondicion.Enabled = false;
                    }
                    else
                    {
                        this.cmbCondicion.Enabled = true;
                    }

                    this.ncf = new NcfBL().GetByIdCondicionTipo(0, "NA").FirstOrDefault();
                    this.lblNcf.Text = this.ncf.DESCRIPCION;
                }
                else
                {
                    Comun.ShowInMainMessage("Cliente está inactico. VERIFIQUE.");
                    this.LimpiarClientesGroup();
                    cliente = null;
                    this.txtIdCliente.Focus();
                }
            }
            else
            {
                Comun.ShowInMainMessage("No existe cliente con este codigo. VERIFIQUE.");
                this.txtIdCliente.SelectAll();
                cliente = null;
                this.txtIdCliente.Focus();
            }
        }

        private void CalcularTotales()
        {
            if (this.newEntity.FACTURAS_DETALLES.Count > 0)
            {
                decimal Tdescuento = 0, Timpuesto = 0, Stotal = 0, T = 0;
                foreach (FACTURAS_DETALLES f in this.newEntity.FACTURAS_DETALLES)
                {
                    Tdescuento = Tdescuento + f.DESCUENTO;
                    Timpuesto = Timpuesto + f.IMPUESTO;
                    Stotal = Stotal + f.SUB_TOTAL_X_PRECIO;
                    T = (Stotal - Tdescuento) + Timpuesto;

                }
                this.lblTotalDescuento.Text = Tdescuento.ToString("N2");
                this.lblTotalImpuestos.Text = Timpuesto.ToString("N2");
                this.lblSubTotal.Text = Stotal.ToString("N2");
                this.lblTotalGeneral.Text = T.ToString("N2");
            }
            else
            {
                this.lblTotalImpuestos.Text = "0.00";
                this.lblTotalDescuento.Text = "0.00";
                this.lblSubTotal.Text = "0.00";
                this.lblTotalGeneral.Text = "0.00";
            }
        }

        private void LimpiarClientesGroup()
        {
            foreach (Control c in this.radGroupBox1.Controls)
            {
                if (c is Label)
                {
                    ((Label)c).Text = "";
                }
            }
        }
        #endregion
    }
}
